# -*- coding: utf-8 -*-
import jsonimport mathfrom mod.common.EntityType import EntityTypefrom mod.server import extraServerApifrom legendaryPowerScript._lpcommon import apiUtilfrom legendaryPowerScript.creatures import Creature, _playersfrom legendaryPowerScript.item.itemTypes import ItemTypefrom legendaryPowerScript.item.legendaryItem import LegendaryItemfrom legendaryPowerScript.item.tags.itemTagType import ItemTagTypefrom legendaryPowerScript.ui.confirmUI import ConfirmUI, ConfirmOptionclass Inventory:
    def __init__(self, creature):
        """
        玩家物品栏类，管理着玩家携带的所有装备、背包道具等物品信息
        在server.yml中关闭了“使用生存背包”时，玩家的背包会是此类的实例。否则会是VanillaInventory
        若无原版玩法，请选择此物品栏。它的效率更高，且可以高度自定义背包格数

        属性：
            - creature (Creature)：所属的角色
            - items (dict[int, LegendaryItem])：背包中存放的格子和物品
            - equipments (dict[int, LegendaryItem])：角色身上穿戴的装备格子和对应的装备
            - disguises (dict[int, LegendaryItem])：角色使用的幻化形象格子和对应的幻化道具
            - quickuse (dict[int, LegendaryItem])：快捷栏存放的格子和对应的物品
            - updated (bool)：是否刷新过物品数量
            - invSize (int)：当前物品栏中物品总数量
            - success (bool)：物品栏修改操作是否成功
            - listeningItem (dict)：监听的物品更新事件字典
        """
        self.creature = Creature()  # type: Creature
        self.items = {}  # type: dict[int, LegendaryItem]
        self.equipments = {}  # type: dict[int, LegendaryItem]
        self.disguises = {}  # type: dict[int, LegendaryItem]
        self.quickuse = {}  # type: dict[int, LegendaryItem]
        self.updated = False  # type: bool
        self.invSize = 0  # type: int
        self.success = False  # type: bool
        self.listeningItem = {}  # type: dict
        pass

    def getItem(self, slot, type=None):
        # type: (int, int) -> LegendaryItem
        """
        获取指定槽位的物品

        参数：
            - slot (int)：槽位编号
            - type (int or None)：物品所在区域，可选值为0（背包）、1（装备）、2（快捷栏）、3（幻化栏），默认为None

        返回：
            - item (LegendaryItem or None)：指定槽位的物品对象，如果找不到物品，则返回None
        """
        pass

    def getAllItems(self):
        # type: () -> dict[int, LegendaryItem]
        """
        获取所有物品栏中的物品

        参数：
            - 无

        返回：
            - items (dict[int, LegendaryItem])：包含所有物品的字典，键为槽位编号，值为物品对象
        """
        pass

    def refreshItemAmount(self):
        # type: () -> NoneType
        """
        刷新物品总重量

        参数：
            - 无

        返回：
            - None (NoneType)：无返回值
        """
        pass

    def setItem(self, slot, item, type=None):
        # type: (int, LegendaryItem, int) -> NoneType
        """
        设置物品到指定槽位

        参数：
            - slot (int)：槽位编号
            - item (LegendaryItem)：要设置的物品
            - type (int)：物品所在区域，可选值为0（背包）、1（装备）、2（快捷栏），默认为0

        返回：
            - None (NoneType)：无返回值
        """
        pass

    def refreshItemTooltipVariable(self, itemName):
        # type: (str) -> NoneType
        """
        刷新物品的提示变量

        参数：
            - itemName (str)：物品名称

        返回：
            - None (NoneType)：无返回值
        """
        pass

    def takeItem(self, itemType, amount, skipSlot=None, bc=False):
        # type: (ItemType, int) -> tuple[int, LegendaryItem]
        """
        取出指定类型的物品数量

        参数：
            - itemType (ItemType or list[ItemType])：要取出的物品类型
            - amount (int)：要取出的物品数量
            - skipSlot (set(tuple[int, int]))：要跳过的槽位集合，默认为None
            - bc (bool)：是否绑定计数，默认为False

        返回：
            - tuple[int, LegendaryItem]：成功取出的物品数量和物品对象的元组，如果没有成功取出物品，则返回剩余未取出的数量和None
        """
        pass

    def getItemHasAmountByParam(self, param, skipSlot=None):
        # type: (dict) -> int
        """
        根据物品表达式（item.toGetItemParam())获取满足该条件的物品数量。

        参数：
            - param (dict)：需要满足的物品表达式

        返回：
            - hasAmount (int)：具有指定参数的物品的数量
        """
        pass

    def getItemHasAmount(self, itemType):
        # type: (Item) -> int
        """
        获取特定类型物品的数量。

        参数：
            - itemType (Item)：物品类型

        返回：
            - hasAmount (int)：特定类型物品的数量
        """
        pass

    def quickuseMove(self, fromSlot, toSlot):
        # type: (int, int) -> None
        """
        在快速使用槽中移动物品。

        参数：
            - fromSlot (int)：移动物品的起始槽位
            - toSlot (int)：移动物品的目标槽位

        返回：
            无
        """
        pass

    def move(self, fromSlot, toSlot):
        # type: (int, int) -> None
        """
        移动物品。

        参数：
            - fromSlot (int)：移动物品的起始槽位
            - toSlot (int)：移动物品的目标槽位

        返回：
            无
        """
        pass

    def equip(self, slot, fromSlot, disguise=False, bypass=False):
        # type: (int, int, bool, bool) -> bool
        """
        将背包中的物品装备在装备栏

        参数：
            - slot (int)：装备的槽位
            - fromSlot (int)：从哪里取出装备
            - disguise (bool)：是否为幻化状态
            - bypass (bool)：是否绕过绑定检测

        返回：
            - success (bool)：装备是否成功
        """
        pass

    def quickuseEquip(self, toSlot, fromSlot):
        # type: (int, int) -> None
        """
        将背包中的物品移入快捷使用栏

        参数：
            - toSlot (int)：使用位置的槽位
            - fromSlot (int)：从哪里取出物品

        返回：
            无
        """
        pass

    def sort(self):
        # type: () -> None
        """
        根据物品文件的路径，整理背包

        参数：
            无

        返回：
            无
        """
        pass

    def hasItemByList(self, list):
        # type: (list) -> bool
        """
        根据一个列表里的物品表达式，判断玩家是否同时拥有这些物品（item.toGetItemParam())

        参数：
            - list (list)：需要判断的物品表达式（item.toGetItemParam())

        返回：
            - allHad (bool)：是否拥有所有的物品
        """
        pass

    def takeItemByList(self, list):
        # type: (list) -> None
        """
        从背包中根据物品表达式（item.toGetItemParam()),移除多个物品

        参数：
            - list (list)：需要取出的物品表达式列表（item.toGetItemParam())

        返回：
            无
        """
        pass

    def addItem(self, item, isPickupItem=False, tryEquip=None, update=True, isNew=True, message=True, force=False):
        # type: (LegendaryItem, bool) -> bool
        """
        将物品加入背包。
        若背包已满，会尝试放入仓库（无视仓库上限）

        参数：
            - item (LegendaryItem)：需要添加的物品对象。
            - isPickupItem (bool)：是否是拾取物品。
            - tryEquip (bool)：是否尝试装备。
            - update (bool)：是否更新背包界面。
            - isNew (bool)：是否为新的物品。
            - message (bool)：是否发送提示信息。
            - force (bool)：是否强制加入背包。默认False（无视背包上限）

        返回：
            - bool：添加物品是否成功。
        """
        pass

    def isFull(self, amount=1):
        # type: (int) -> bool
        """
        判断背包是否已满。

        参数：
            - amount (int)：需要添加的物品数量（默认为 1）。

        返回：
            - bool：背包是否已满。
        """
        pass

    def getEquipment(self, slot, disguise=False):
        # type: (int, bool) -> LegendaryItem/None
        """
        获取指定装备槽位的装备。

        参数：
            - slot (int)：装备槽位。
            - disguise (bool)：是否假装。

        返回：
            - LegendaryItem/None：指定槽位的装备对象，若不存在则返回 None。
        """
        pass

    def getEquipmentForOutfit(self, slot):
        # type: (int) -> LegendaryItem/None
        """
        根据外观获取指定装备槽位的装备。

        参数：
            - slot (int)：装备槽位。

        返回：
            - LegendaryItem/None：指定槽位的装备对象，若不存在则返回 None。
        """
        pass

    def takeAmount(self, slot, amount, type=None):
        # type: (int, int/float, dict/int/None) -> None
        """
        从背包或装备栏中取出指定数量的物品。

        参数：
            - slot (int)：物品槽位。
            - amount (int/float)：需要取出的物品数量。
            - type (dict/int/None)：取出物品的类型。默认为 None，即在所有物品中查找。

        返回：
            - None。
        """
        pass

    def getHoldingItem(self):
        # type: (无。) -> None
        """
        获取玩家手持物品。仅在使用原版背包时有用

        参数：
            无。

        返回：
            - None：当前玩家手持物品对象，若不存在则返回 None。
        """
        pass

    def serializeInventory(self, isSave=False):
        # type: (bool) -> dict
        """
        将背包中的物品序列化为字典。

        参数：
            - isSave (bool)：是否是用于保存。

        返回：
            - dict：包含序列化后物品信息的字典。
        """
        pass

    def serializeDisguise(self, isSave=False):
        # type: (bool) -> dict
        """
        将时装栏中的物品序列化为字典。

        参数：
            - isSave (bool)：是否是用于保存。

        返回：
            - dict：包含序列化后物品信息的字典。
        """
        pass

    def serializeEquipment(self, isSave=False):
        # type: (bool) -> dict
        """
        将装备栏中的物品序列化为字典。

        参数：
            - isSave (bool)：是否是用于保存。

        返回：
            - dict：包含序列化后物品信息的字典。
        """
        pass

    def serializeQuickuse(self, isSave=False):
        # type: (bool) -> dict
        """
        将快捷栏中的物品序列化为字典。

        参数：
            - isSave (bool)：是否是用于保存。

        返回：
            - dict：包含序列化后物品信息的字典。
        """
        pass

    def load(self, dict, data):
        # type: (dict, dict) -> None
        """
        加载物品。

        参数：
            - dict (dict)：存储物品的字典。
            - data (dict)：需要加载的物品信息。

        返回：
            - None。
        """
        pass

    def open(self, inv=True, equip=True, quick=True, open=True, viewer=None, disguise=True):
        # type: (bool, bool, bool, bool, npc/NPC, bool) -> None
        """
        打开背包界面，或是更新客户端的背包缓存信息

        参数：
            - inv (bool)：是否打开背包界面。若False，则只是更新客户端的背包物品缓存
            - equip (bool)：是否打开装备栏界面。
            - quick (bool)：是否打开快捷栏界面。
            - open (bool)：是否打开整个背包界面。
            - viewer (npc/NPC)：需要打开背包界面的玩家。
            - disguise (bool)：是否打开伪装栏界面。

        返回：
            - None。
        """
        pass

    def serialize(self, item, isSave):  # 把物品序列化
        # type: (dict/LegendaryItem, bool) -> dict
        """
        将物品序列化。

        参数：
            - item (dict/LegendaryItem)：待序列化的物品对象或字典。
            - isSave (bool)：指示是否为保存操作。

        返回：
            - itemDict (dict)：序列化后的物品字典。
        """
        pass

    def refreshInventoryTooltip(self):
        # type: () -> None
        """
        刷新物品栏的提示信息。

        参数：
            无

        返回：
            无
        """
        pass

    def viewInText(self, creature, name, prefix=""):
        # type: (Creature or ConsoleSender or MasterSender, str, str, optional) -> None
        """
        用文本的形式打印背包信息。

        参数：
            - creature (Creature or ConsoleSender or MasterSender)：信息接收者
            - name (str)：物品栏名称。
            - prefix (str, optional)：前缀字符串，默认为空。

        返回：
            无
        """
        pass

    def getTypeDictByInt(self, type):
        # type: (int) -> dict
        """
        根据整数值获取相应类型的字典。

        参数：
            - type (int)：类型标识，1表示装备栏，2表示道具栏。

        返回：
            - typeDict (dict)：相应类型的字典。
        """
        pass

